Tableau Tips: 「大容量の抽出ファイル作成&パブリッシュ」の手間を「空の抽出ファイル作成」で効率化する #tableau
先日Tableau関連のSNSで以下のトピックが挙がっており、目を通してみたところ非常に有用なテクニックが紹介されていました。「大容量の抽出ファイルを作成しパブリッシュする時の手間や問題を省くために"空の抽出ファイルを作成"して対応する」というものです。内容的にも一手間加えるだけで実現出来て非常に便利なものでしたので、当エントリでもその内容を実際に試してみたいと思います。
Tableauにおける「抽出ファイル作成&パブリッシュ」の流れと問題点
Tableauでは、データをライブな(リアルタイムの)接続方式では無く、ある一定タイミングに於けるスナップショットの形で、ローカル環境にデータをコンパクトにまとめた、圧縮した形で保存しておける手段があります。これは「抽出」と呼ばれるもので、リアルタイム性は無くなりますがデータを非常に素早く効率的に扱う事が出来るようになります。また、この抽出ファイルはTableau Server上にデータソースとしてパブリッシュする事が出来、Tableau Serverのスケジュールで「抽出の更新」を定期的に行わせる事でTableau Server上にあるデータソースを有効に活用出来るようになる(対象データソースに対する負荷を分散出来るようになる)というメリットもあります。
...という便利な機能ではあるのですが、この抽出ファイルを作成する上で「件数が多い、容量が多い」データソースを対象にするとなると最初の準備がちょっと手間が掛かるようになってしまいます。一般的な手順としてはまず「対象全件」を抽出対象としてデータを持ってきた上でそれらを抽出ファイルとして作成...という流れとなるので、ここでデータ量が膨大となってしまうとデータを引っ張ってくるだけでも時間が掛かります。また、ストレージ容量が数GB〜数十GB規模ともなると、ローカル環境のストレージ容量を圧迫する事態も十分予想されます。
この作業は「最初の1回やってしまえば」あとはTableau Server上で管理出来るようになるのですが、その「最初の1回」で苦労しがちな部分でもあります。今回ご紹介する内容はその苦労しがちな部分を「ひと工夫」を加える事で効率化しよう、というものになります。
「空のTDEファイル作成&パブリッシュ」実践
当内容を検証するにあたり、Amazon Redshiftに以下のような形で大きめのデータを用意しました。件数は5000万件、データサイズは2.7GB程です。
# \d public.lineorder; Table "public.lineorder" Column | Type | Modifiers --------------------+-----------------------+----------- lo_orderkey | integer | not null lo_linenumber | integer | not null lo_custkey | integer | not null lo_partkey | integer | not null lo_suppkey | integer | not null lo_orderdate | integer | not null lo_orderpriority | character varying(15) | not null lo_shippriority | character varying(1) | not null lo_quantity | integer | not null lo_extendedprice | integer | not null lo_ordertotalprice | integer | not null lo_discount | integer | not null lo_revenue | integer | not null lo_supplycost | integer | not null lo_tax | integer | not null lo_commitdate | integer | not null lo_shipmode | character varying(10) | not null # SELECT COUNT(*) FROM public.lineorder; count ---------- 50000000 (1 row) # select trim(pgn.nspname) as Schema, trim(a.name) as Table, (CAST(b.mbytes as double precision) / 1024) as gbytes, a.rows, to_char(a.rows, '9999,9999,9999,9999') as rows_jp from ( select db_id, id, name, sum(rows) as rows from stv_tbl_perm a group by db_id, id, name ) as a join pg_class as pgc on pgc.oid = a.id join pg_namespace as pgn on pgn.oid = pgc.relnamespace join pg_database as pgdb on pgdb.oid = a.db_id join ( select tbl, count(*) as mbytes from stv_blocklist group by tbl ) b on a.id = b.tbl where trim(pgn.nspname) = 'public' and trim(a.name) = 'lineorder' order by mbytes desc, a.db_id, a.name; schema | table | gbytes | rows | rows_jp --------+-----------+-----------+----------+---------------------- public | lineorder | 2.7734375 | 50000000 | 5000,0000
Amazon Redshiftに対し、Tableau Desktopから直にアクセスして件数を確認してみます。
そしてここから実践開始。まず始めに「パラメータの作成」を実施。
以下の形で、真偽値を取るパラメータを新規作成します。
続いて計算フィールドを作成。
上記パラメータ値をそのまま参照させるような形でこちらも計算フィールドを新規作成します。
そしてデータの抽出を実施。
この時、上記手順で作ったフィールドを活用します。先ほど作った計算フィールドをフィルターとして追加。
フィルターの条件として「真(true)を除外」という形で設定します。
[抽出]を押下。
任意の名前を付けて抽出ファイル作成を実行。すると通常の作成であればそれなりの時間が掛かる抽出ファイル作成の処理が一瞬で終わります。上記フィルタの追加での設定を行った事で、本来作成されるべき処理の部分がスキップされた形となりました。
作成されたファイルを確認してみます。データ自体が含まれない、ほぼガラだけのサイズ感となっている事が確認出来ました。
空のtdeファイルをTableau Serverにパブリッシュします。ここで大切なのは先ほど作成したパラメータの設定を、パブリッシュ前に切り替えておくことです。「パラメータコントロールの表示」を行い、
設定値を「偽(false)」となる値(ここでは"No")を選択切り替えしておきます。先程の条件と逆の値を設定しておく事で今度はちゃんと抽出作業が行われる流れになる、という事ですね。
Tableau Serverに空のTDEファイルをパブリッシュします。
接続先をAmazon Redshiftへのライブ接続から、パブリッシュしたTDEファイルに切り替えてみます。Tableau Desktopを起動し直して接続先設定をTableau Serverに向け、
先程と同じように件数表示をさせてみました。TDEファイルは空なので当然ながら件数も0件です。
上記パブリッシュしたTDEファイルはタスクとしてTableau Serverのスケジュールで実行されるように設定していますが、ここではそのスケジュール実行を待たずに一回手動実行させてみたいと思います。作成した「抽出の更新」を"今すぐ実行"。
しばらくして処理が完了しました。
処理完了後先程のTableau Desktop接続をリロードしてみます。抽出内容が反映されている事をDesktop上でも確認出来ました。
まとめ
という訳で、「空のTDEファイルを作成してパブリッシュ」という、日々の運用作業で役立ちそうなワザのご紹介でした。扱うデータ量が大きくなればなる程効いてくるテクニックだと思いますので、是非有効活用していきたいところですね。